package main

import (
	"fmt"
	"reflect"
)

type Cat struct {
}

func main() {
	Students()
	a := float32(3.14)
	reflectType(a)
	b := int64(100)
	reflectType(b)
	var c = Cat{}
	reflectType(c)
	reflectSetValue(b)
	fmt.Println(b)
}

func reflectType(x interface{}) {
	v := reflect.TypeOf(x)
	fmt.Printf("type:%v\n", v)
	fmt.Printf("type name:%v type kind:%v", v.Name(), v.Kind())
}

// 通过反射设置变量的值

func reflectSetValue(x interface{}) {
	v := reflect.ValueOf(x)
	// 反射中使用Elem（）方法获取指针对应的值
	if v.Elem().Kind() == reflect.Int64 {
		v.Elem().SetInt(200) // 修改的是副本，reflect会引发panic
	}
}

type student struct {
	Name  string `json:"name" zhoulin:"嘿嘿嘿"`
	Score int    `json:"score" zhoulin："哈哈哈"`
}

func Students() {
	stuq := student{
		Name:  "王子",
		Score: 90,
	}
	t := reflect.TypeOf(stuq)
	fmt.Println(t.Name(), t.Kind()) // tudent struct
	// 通过for循环遍历结构体内所有字段信息
	fmt.Println(t.NumField()) // 字段长度
	for i := 0; i < t.NumField(); i++ {
		filed := t.Field(i)
		fmt.Printf("name:%s index:%d type:%v json tage:%v\n", filed.Name, filed.Index, filed.Type, filed.Tag.Get("zhoulin"))
	}
}
